iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
SideProject30

我想自己刻部落格系列 第 12

使用 DI 相依性注入

  • 分享至 

  • xImage
  •  

NET Core 支援相依性注入 (Dependency Injection,DI) 軟體設計模式。

在以前 .NET Framework 時期,需要安裝額外套件才能支援 DI

相依性注入(Dependency Injection)是軟體設計中的一個重要概念,它有助於實現程式碼的模組化、可測試性和鬆散耦合。以下是對相依性注入的簡單介紹:

相依性:在軟體中,一個模組或類別可能需要使用其他模組或類別的服務或物件,這種需求被稱為相依性。這些相依性通常以物件實例、函數或其他資源的形式存在。

例如程式中 A 物件 呼叫了 B物件才能執行,則 A物件跟B物件有相依性

相依性注入:相依性注入是一種設計模式,它的目標是將一個物件的相依性(通常是服務或資源)從該物件本身中解耦。這樣做的好處是可以更容易地測試、維護和擴展程式碼。

我們可以透過相依性注入,來控制或管理 A物件所使用的 B物件。

例如在 UnitOfWork 中,我們使用的 MyBlogContext , 在 Program.cs 已經註冊過了。所以在建構式宣告,由 DI 進行建構式注入來提供。

 public class UnitOfWork : IUnitOfWork
 {
        public DbContext Context { get; set; }
        // 建構式注入
        public UnitOfWork(MyBlogContext dbContext)
        {
            Context = dbContext;
        }
builder.Services.AddDbContext<MyBlogContext>(...)

三種注入生命週期

  1. Transient (暫時性的實體)
  • 每次注入時都建立新物件
  1. Scoped (範圍內的實體)
    -該物件只會在每個請求間共用一個物件,在第一次注入時建立新物件

  2. Singleton (單一實體)
    -當網站啟動時,在第一次注入時建立新物件

最常使用的順序也是 1. Transient 2. Scoped 3.Singleton 三個順序

而 AddDbContext 是屬於 Scoped ,在整個請求期間都是同一個 DbContext 。所以你若確定你建立的 Repository 或 Service 可以只用 Scoped 也是可以。

uilder.Services.AddDbContext<MyBlogContext>(options =>
        options.UseSqlServer(builder.Configuration.GetConnectionString("MyBlogConnection"))
);

builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();
builder.Services.AddScoped<IPostRepository, PostRepository>();
builder.Services.AddScoped<IUserRepository, UserRepository>();
builder.Services.AddScoped<IOptionRepository, OptionRepository>();

若你的 UnitOfWork 想跟 MyBlogContext 解耦合,變成相依於 DbContext,可以這麼設定

 public class UnitOfWork : IUnitOfWork
 {
        public DbContext Context { get; set; }
        // 建構式注入
        public UnitOfWork(DbContext dbContext)
        {
            Context = dbContext;
        }
builder.Services.AddDbContext<MyBlogContext>(...)
builder.Services.AddScoped<DbContext, MyBlogContext>();
builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();

上一篇
建立各資料表的 Repository 與註冊 DbContext
下一篇
建立 Post Service
系列文
我想自己刻部落格31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言